package com.zjsru.plan2023.oneday;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: CookLee
 * @Date: 2023/5/7
 *总持续时间可被 60 整除的歌曲
 *
 * 输入：time = [30,20,150,100,40]
 * 输出：3
 * 解释：这三对的总持续时间可被 60 整除：
 * (time[0] = 30, time[2] = 150): 总持续时间 180
 * (time[1] = 20, time[3] = 100): 总持续时间 120
 * (time[1] = 20, time[4] = 40): 总持续时间 60
 *
 * 输入：time = [60,60,60]
 * 输出：3
 * 解释：所有三对的总持续时间都是 120，可以被 60 整除。
 */
public class NumPairsDivisibleBy60 {
    /**
     * 数学方法
     *
     * @param time 时间
     * @return int
     */
    public int numPairsDivisibleBy60(int[] time) {
        int[] counts = new int[60];
        //获取除以60后任意分钟的计数
        for (int one : time) {
            counts[one % 60]++;
        }
        long ans = 0;
        for (int i = 1; i < 30; i++) {
            //可以互相组成歌曲对
            ans += (long) counts[i] * counts[(60 - i)];
        }
        //余数为 0/30 的歌曲。他们需要与余数为 0/30 的歌曲组成对，但不能与自己组成对歌曲对
        ans += (long) counts[0] * (counts[0] - 1) / 2 + (long) counts[30] * (counts[30] - 1) / 2;
        return (int) ans;
    }

    /**
     * 哈希表
     *
     * @param time 时间
     * @return int
     */
    public int numPairsDivisibleBy602(int[] time) {
        Map<Integer, Integer> map = new HashMap<>();
        int ans = 0;
        for (int one : time) {
            int mod = one % 60;
            //获取该mod的对应匹配的歌曲key
            ans += map.getOrDefault((60 - mod) % 60, 0);
            map.put(mod, map.getOrDefault(mod, 0) + 1);
        }
        return ans;
    }

    public static void main(String[] args) {
        NumPairsDivisibleBy60 numPairsDivisibleBy60 = new NumPairsDivisibleBy60();
        int[] time = new int[]{30, 20, 150, 100, 40};
        System.out.println(numPairsDivisibleBy60.numPairsDivisibleBy60(time));
    }
}
